using Vin.AspNetCore.Core.Controller;
using Vin.Extension.Framework.Dto;
using Vin.Extension.Framework.Models;
using Vin.Extension.JwtBearer.Tool;
using Vin.Tool.Domain.ExceptionModel;

namespace Vin.Extension.Framework.Base;

public class VinFrameworkBaseController : VinBaseController
{
    public long? AccountId => GetVinTokenModel().RealAccountId;

    public string? Account => GetVinTokenModel().AccountName;

    public long? UserId => GetVinTokenModel().RealUserId;
    
    public string? UserName => GetVinTokenModel().UserName;

    public VinTokenModel GetVinTokenModel()
    {
        // return VinSecurityTool.GetTokenModelByToken<VinTokenModel>() ?? throw new UnauthorizedException();
        return GetTokenModel<VinTokenModel>();
    }

    public VinTokenModel? GetVinTokenModelOrNull()
    {
        // return VinSecurityTool.GetTokenModelByToken<VinTokenModel>();
        return GetTokenModelOrNull<VinTokenModel>();
    }

    public T GetTokenModel<T>() where T : VinTokenModel
    {
        return GetTokenModelOrNull<T>() ?? throw new UnauthorizedException();
    }

    public T? GetTokenModelOrNull<T>() where T : VinTokenModel
    {
        return VinSecurityTool.GetTokenModelByToken<T>();
    }
}